package com.cskaoyan._01encapsulate._01introduction;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/8 9:32
 **/
/*
封装（encapsulate）是指将数据及相关操作绑定在一起的一种编程机制，
使其构成一个不可分割的独立实体。
在Java中，类就是这样一种结构。
当然，数据被保护在类的内部，是为了尽可能地隐藏内部的细节，
只保留一些对外"接口"使之与外部发生联系。

把抽象出来的数据(属性), 和对数据的操作(方法)封装在一起,
数据被保护在内部, 程序的其他部分只有被授权的操作(方法), 才能对数据进行操作.

封装的好处
- 使用者能够完全得到自己想要的功能，又不需要思考过多细节
- 实现者可以隐藏功能实现的细节，方便灵活进行修改而不影响使用者使用
- 可以对数据进行验证，保证安全合理

封装的步骤:
1.需要的属性进行私有化
2.提供一个public 的get方法, 访问成员变量的值
3.提供一个public的set方法, 修改成员变量的值

 */
public class Demo {
    public static void main(String[] args) {
        // 创建Student对象
        // Student student = new Student();
        //student.name = "zs";
        // 显然,这些数据设置的根本不合理
        //student.age = 1000;
        //student.score = -100;

        Student student = new Student("zs", 20, 90);
        // System.out.println(student.age);
        // System.out.println(student.score);
        System.out.println(student.name);

        System.out.println(student.getAge());
        student.setAge(30);
        System.out.println(student.getAge());

    }
}

class Student{
    String name;
    private int age;
    private int score;

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    // get方法 名命规则getXxx() 小驼峰
    public int getAge(){
        // 做一些校验工作,一些权限问题
        // 个人隐私,管理员可以查看,别人不允许
        // ....
        return age;
    }

    // set方法 命名规则setXxxx(参数) 小驼峰
    public void setAge(int age) {
        // 对数据做一些校验工作
        // 进行判断数据的合理性
        this.age = age;
    }

    // 快捷键  alt+insert

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}